home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / presto / prest_04.lha / src / locks.h < prev    next >
Encoding:
C/C++ Source or Header  |  1989-06-06  |  2.0 KB  |  99 lines

  1.  
  2.  
  3. #ifndef _LOCKS_H
  4.  
  5.  
  6. #define _LOCKS_H
  7. //
  8. // Locks and monitors
  9. //
  10.  
  11. class Lock : public SynchroObject    {
  12.     Thread    *lo_owner;
  13.     void    lock2();            // looping lock
  14. public:
  15.     Lock(char *name=0);
  16.     Lock(char *name, int locktype);
  17.     ~Lock();
  18.     void lock();        // no competition
  19.     void unlock();
  20.     Thread *owner()
  21.         { return  lo_owner; }
  22.     virtual void print(ostream& = cout);
  23. };
  24.  
  25. class Monitor : public Lock         {
  26. public:
  27.     Monitor(char* name=0);
  28.     ~Monitor();
  29.     inline void entry()
  30.         { Lock::lock(); }
  31.     inline void exit()
  32.         { Lock::unlock(); }
  33.     Thread *owner()
  34.         { return Lock::owner(); }
  35.     virtual void print(ostream& = cout);
  36. };
  37.  
  38. //
  39. // Syntactic sugaring for automatically releasing monitors on
  40. // subroutine exit.  Should only be built on the stack.
  41. //
  42. class MONITOR    {
  43.     Monitor *mo_mon;
  44. public:
  45.     MONITOR(Monitor *m)
  46.         { mo_mon = m; m->entry(); }
  47.     inline MONITOR(Monitor& m)
  48.         { mo_mon = &m; m.entry(); }
  49.     inline ~MONITOR()
  50.         { register Monitor* m = mo_mon; m->exit(); }
  51. };
  52.  
  53.  
  54.  
  55. class MonitorQ : public Oqueue    {
  56. public:
  57.     MonitorQ(Monitor* m = 0) : ( m )
  58.         {;}
  59.     ~MonitorQ()
  60.         { cerr << "monitorq destructor called\n"; }
  61.     Monitor*    get()
  62.         { return (Monitor*)Oqueue::get(); }
  63.     Monitor*    lookat()
  64.         { return (Monitor*)Oqueue::lookat(); }
  65.     void        append(Monitor *m)
  66.         { Oqueue::append(m); }
  67.     void        prepend(Monitor *m)
  68.         { Oqueue::prepend(m); }
  69.     void        remove(Monitor *m)
  70.         { Oqueue::remove(m); }
  71. };
  72.  
  73.  
  74. class Condition : public SynchroObject    {
  75.     Monitor*    co_monitor;        // bound monitor
  76. public:
  77.     Condition(char* name=0);    // unbound
  78.     Condition(Monitor* boundmon);    // bound, no name
  79.     Condition(Monitor& boundmon);
  80.     Condition(Monitor* boundmon, char* name);
  81.     Condition(Monitor& boundmon, char* name);
  82.     Monitor* monitor()
  83.         { return co_monitor; }
  84.     int threadok()                // is cond user legit
  85.         { return ((!co_monitor) ||     // unbound is free4all
  86.              (thisthread == co_monitor->owner()));}  
  87.     ~Condition();
  88.     void signal();            // wakeup one
  89.     void broadcast();        // wakeup all
  90.     void wait();            // wait for signal (could pickup old)
  91.     virtual void print(ostream& = cout);
  92. };
  93.  
  94.  
  95.  
  96.  
  97.  
  98. #endif _LOCKS_H
  99.